// Text Files (文本文件) 示例
// 演示 Pascal 中文本文件操作的各种用法
program p_22_text_files;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 定义学生记录类型
type
  TStudent = record
    Name: String[50];
    Age: Integer;
    Score: Real;
  end;

// 写入学生数据到文本文件的过程
procedure WriteStudentsToFile(filename: String);
var
  fileVar: Text;
  students: array[1..3] of TStudent;
begin
  // 初始化学生数据
  students[1].Name := '张三';
  students[1].Age := 20;
  students[1].Score := 85.5;
  
  students[2].Name := '李四';
  students[2].Age := 19;
  students[2].Score := 92.0;
  
  students[3].Name := '王五';
  students[3].Age := 21;
  students[3].Score := 78.5;
  
  // 创建并打开文件用于写入
  Assign(fileVar, filename);
  Rewrite(fileVar);
  
  // 写入学生数据
  WriteLn(fileVar, '学生信息列表');
  WriteLn(fileVar, '===================');
  for var i := 1 to 3 do
  begin
    WriteLn(fileVar, '姓名: ', students[i].Name);
    WriteLn(fileVar, '年龄: ', students[i].Age);
    WriteLn(fileVar, '分数: ', students[i].Score:0:1);
    WriteLn(fileVar);  // 空行分隔
  end;
  
  // 关闭文件
  Close(fileVar);
  WriteLn('  已将学生数据写入文件: ', filename);
end;

// 从文本文件读取学生数据的过程
procedure ReadStudentsFromFile(filename: String);
var
  fileVar: Text;
  line: String;
begin
  // 打开文件用于读取
  Assign(fileVar, filename);
  Reset(fileVar);
  
  WriteLn('  文件内容:');
  // 读取并显示文件内容
  while not Eof(fileVar) do
  begin
    ReadLn(fileVar, line);
    WriteLn('    ', line);
  end;
  
  // 关闭文件
  Close(fileVar);
end;

// 追加日志信息到文件的过程
procedure AppendLogEntry(filename: String; entry: String);
var
  fileVar: Text;
begin
  // 打开文件用于追加
  Assign(fileVar, filename);
  if FileExists(filename) then
    Append(fileVar)  // 如果文件存在，追加到末尾
  else
    Rewrite(fileVar);  // 如果文件不存在，创建新文件
  
  // 写入日志条目
  WriteLn(fileVar, DateTimeToStr(Now), ' - ', entry);
  
  // 关闭文件
  Close(fileVar);
  WriteLn('  已添加日志条目到文件: ', filename);
end;

// 读取并解析配置文件的过程
procedure ReadConfigFile(filename: String);
var
  fileVar: Text;
  line: String;
  equalsPos: Integer;
  key, value: String;
begin
  // 创建示例配置文件
  Assign(fileVar, filename);
  Rewrite(fileVar);
  WriteLn(fileVar, '# 这是一个示例配置文件');
  WriteLn(fileVar, 'username=admin');
  WriteLn(fileVar, 'password=123456');
  WriteLn(fileVar, 'host=localhost');
  WriteLn(fileVar, 'port=8080');
  Close(fileVar);
  
  // 读取并解析配置文件
  Assign(fileVar, filename);
  Reset(fileVar);
  
  WriteLn('  配置信息:');
  while not Eof(fileVar) do
  begin
    ReadLn(fileVar, line);
    // 跳过注释行和空行
    if (line <> '') and (line[1] <> '#') then
    begin
      // 解析键值对
      equalsPos := Pos('=', line);
      if equalsPos > 0 then
      begin
        key := Copy(line, 1, equalsPos - 1);
        value := Copy(line, equalsPos + 1, Length(line));
        WriteLn('    ', key, ' = ', value);
      end;
    end;
  end;
  
  Close(fileVar);
end;

// 程序主入口
begin
  WriteLn('=== Pascal 文本文件操作示例 ===');
  WriteLn;
  
  // 1. 创建并写入文本文件
  WriteLn('1. 创建并写入文本文件:');
  WriteStudentsToFile('students.txt');
  
  WriteLn;
  
  // 2. 读取文本文件
  WriteLn('2. 读取文本文件:');
  ReadStudentsFromFile('students.txt');
  
  WriteLn;
  
  // 3. 追加数据到文本文件
  WriteLn('3. 追加数据到文本文件:');
  AppendLogEntry('log.txt', '程序启动');
  AppendLogEntry('log.txt', '执行操作A');
  AppendLogEntry('log.txt', '执行操作B');
  AppendLogEntry('log.txt', '程序关闭');
  
  // 显示日志文件内容
  WriteLn('  日志文件内容:');
  var logFile: Text;
  Assign(logFile, 'log.txt');
  Reset(logFile);
  while not Eof(logFile) do
  begin
    var line: String;
    ReadLn(logFile, line);
    WriteLn('    ', line);
  end;
  Close(logFile);
  
  WriteLn;
  
  // 4. 读取并解析配置文件
  WriteLn('4. 读取并解析配置文件:');
  ReadConfigFile('config.txt');
  
  WriteLn;
  
  // 5. 文件状态检查
  WriteLn('5. 文件状态检查:');
  var testFile: String = 'students.txt';
  if FileExists(testFile) then
  begin
    WriteLn('  文件 ''', testFile, ''' 存在');
    WriteLn('  文件大小: ', FileSize(testFile), ' 字节');
  end
  else
    WriteLn('  文件 ''', testFile, ''' 不存在');
  
  WriteLn;
  
  // 6. 清理 - 删除示例文件
  WriteLn('6. 清理:');
  var filesToDelete: array[1..3] of String = ('students.txt', 'log.txt', 'config.txt');
  for var i := 1 to 3 do
  begin
    if FileExists(filesToDelete[i]) then
    begin
      var fileVar: Text;
      Assign(fileVar, filesToDelete[i]);
      Erase(fileVar);
      WriteLn('  已删除文件: ', filesToDelete[i]);
    end;
  end;
  
  WriteLn;
  WriteLn('演示了 Pascal 中文本文件操作的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.